home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / source / units / ogware.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-04-03  |  15.6 KB  |  804 lines

  1. UNIT OGWare;
  2.  
  3. INTERFACE
  4.  
  5. {----------------------------------------------------------------------------}
  6.  
  7. CONST     ON          = TRUE;
  8.           OFF         =FALSE;
  9.  
  10.           CapsLock    =   64;
  11.           NumLoad     =   32;
  12.           ScrollLock  =   16;
  13.  
  14.           CurNone     =    0;
  15.           CurScore    =    1;
  16.           CurBlock    =    2;
  17.  
  18.           Hexes       : ARRAY[0..$F] OF CHAR='0123456789ABCDEF';
  19.  
  20.           Black       =  0; Blue        =  1; Green       =  2;
  21.           Cyan        =  3; Red         =  4; Magenta     =  5;
  22.           Brown       =  6; LightGray   =  7; LightGrey   =  7;
  23.           DarkGray    =  8; DarkGrey    =  8; LightBlue   =  9;
  24.           LightGreen  = 10; LightCyan   = 11; LightRed    = 12;
  25.           LightMagenta= 13; Yellow      = 14; White       = 15;
  26.  
  27. {----------------------------------------------------------------------------}
  28.  
  29. VAR       Audio,
  30.           ButtonPress:BOOLEAN;
  31.           ScanCode,
  32.           wile,
  33.           wiri,
  34.           wibo,
  35.           wito,
  36.           scrX,
  37.           scrY,
  38.           fontsize,
  39.           attribute,
  40.           page:BYTE;
  41.           Lpt1:WORD ABSOLUTE $0040:$0008;
  42.           Lpt2:WORD ABSOLUTE $0040:$000A;
  43.           Lpt3:WORD ABSOLUTE $0040:$000C;
  44.           Lpt4:WORD ABSOLUTE $0040:$000E;
  45.  
  46. {----------------------------------------------------------------------------}
  47.  
  48. PROCEDURE AmigaPlay(lpt,size,delay:WORD; VAR snd);
  49. PROCEDURE Beep(frequency,duration:WORD);
  50. PROCEDURE Border(color:BYTE);
  51. PROCEDURE ClearKeyBuffer;
  52. PROCEDURE ClearLine(line:BYTE);
  53. PROCEDURE ClearScreen;
  54. PROCEDURE ClearWholeScreen;
  55. PROCEDURE ClrScr;
  56. PROCEDURE Color(fg,bg:BYTE);
  57. PROCEDURE Cursor(mode:BYTE);
  58. PROCEDURE DefineLed(led:BYTE; method:BOOLEAN);
  59. PROCEDURE GetPos(VAR xpos,ypos:BYTE);
  60. PROCEDURE GetVideoData;
  61. PROCEDURE Intense(state:BOOLEAN);
  62. PROCEDURE LowerCase(VAR stg:STRING);
  63. PROCEDURE PcPlay(lpt,size,delay:WORD; VAR snd);
  64. PROCEDURE ScrollDown(lines:BYTE);
  65. PROCEDURE ScrollUp(lines:BYTE);
  66. PROCEDURE SetPos(xpos,ypos:BYTE);
  67. PROCEDURE SetWindow(xa,ya,xb,yb:BYTE);
  68. PROCEDURE Silence;
  69. PROCEDURE Speaker(frequency:WORD);
  70. PROCEDURE ToggleLed(led:BYTE);
  71. PROCEDURE UpperCase(VAR stg:STRING);
  72. PROCEDURE UseDosFont(font:POINTER);
  73. PROCEDURE Wait(ms:WORD);
  74. PROCEDURE Wrt(line:STRING);
  75. PROCEDURE WrtPos(xpos,ypos:BYTE; line:STRING);
  76.  
  77. {----------------------------------------------------------------------------}
  78.  
  79. FUNCTION  Byte2Hex(bte:BYTE):STRING;
  80. FUNCTION  ByteSize(filename:STRING):LONGINT;
  81. FUNCTION  CurrentKey:CHAR;
  82. FUNCTION  Dec2Word(stg:STRING):WORD;
  83. FUNCTION  Deg2Rad(deg:REAL):REAL;
  84. FUNCTION  Factorize(VAR nr:WORD):WORD;
  85. FUNCTION  Factorize2String(nr:WORD):STRING;
  86. FUNCTION  File2Pointer(filename:STRING; VAR fl:POINTER):WORD;
  87. FUNCTION  FileExists(filename:STRING):BOOLEAN;
  88. FUNCTION  GetKey:CHAR;
  89. FUNCTION  InString(small,big:STRING):BOOLEAN;
  90. FUNCTION  InterruptVector(pntr:POINTER; itr:BYTE):POINTER;
  91. FUNCTION  IsPrime(nr:WORD):BOOLEAN;
  92. FUNCTION  KeyWaiting:BOOLEAN;
  93. FUNCTION  Len(stg:STRING):BYTE;
  94. FUNCTION  NextPrime(VAR nr:WORD):BOOLEAN; { TRUE & new nr value }
  95. FUNCTION  Null(nr,len:INTEGER):STRING;
  96. FUNCTION  Rad2Deg(rad:REAL):REAL;
  97. FUNCTION  Word2Hex(wrd:WORD):STRING;
  98. FUNCTION  X2Y(x,y:REAL):REAL;
  99.  
  100. {----------------------------------------------------------------------------}
  101.  
  102. IMPLEMENTATION
  103.  
  104. USES      Dos;
  105.  
  106. {****************************************************************************}
  107.  
  108. PROCEDURE AmigaPlay(lpt,size,delay:WORD; VAR snd); ASSEMBLER;
  109.  ASM
  110.      PUSH ds
  111.      MOV  dx,Lpt
  112.      MOV  bx,size
  113.      LDS  si,snd
  114. @lp: LODSB
  115.      XOR  al,128
  116.      OUT  dx,al
  117.      { ms wait }
  118.      MOV  ax,1000
  119.      MUL  delay
  120.      MOV  cx,dx
  121.      MOV  dx,ax
  122.      MOV  ah,$86
  123.      INT  $15
  124.      { ms wait }
  125.      DEC  bx
  126.      JNZ  @lp
  127.      POP  ds
  128.  END;
  129.  
  130. PROCEDURE Beep(frequency,duration:WORD); ASSEMBLER;
  131.  ASM
  132.      CMP  Audio,ON
  133.      JNE  @qt
  134.      IN   al,$61
  135.      OR   al,003
  136.      OUT  $61,al
  137.      MOV  al,182
  138.      OUT  $43,al
  139.      MOV  ax,frequency
  140.    { NOT  ax
  141.      SHR  ax,002 }
  142.      OUT  $42,al
  143.      MOV  al,ah
  144.      OUT  $42,al
  145.      { ms wait }
  146.      MOV  ax,1000
  147.      MUL  duration
  148.      MOV  cx,dx
  149.      MOV  dx,ax
  150.      MOV  ah,$86
  151.      INT  $15
  152.      { ms wait }
  153.      IN   al,$61
  154.      AND  al,252
  155.      OUT  $61,al
  156. @qt:
  157.  END;
  158.  
  159. PROCEDURE Border(color:BYTE); ASSEMBLER;
  160.  ASM
  161.      MOV  ah,$0B
  162.      MOV  bx,$000F
  163.      AND  bl,color
  164.      INT  $10
  165.  END;
  166.  
  167. PROCEDURE ClearKeyBuffer; ASSEMBLER;
  168.  ASM
  169.      MOV  ax,$0040
  170.      MOV  es,ax
  171.      MOV  bx,es:[$001A]
  172.      MOV  es:[$001C],bx
  173.  END;
  174.  
  175. PROCEDURE ClearLine(line:BYTE); ASSEMBLER;
  176.  ASM
  177.      MOV  ah,$07
  178.      MOV  al,$00
  179.      MOV  bh,attribute
  180.      MOV  cl,wile
  181.      MOV  ch,line
  182.      DEC  ch
  183.      CMP  ch,wibo
  184.      JA   @qt
  185.      ADD  ch,wito
  186.      MOV  dh,ch
  187.      MOV  dl,wiri
  188.      INT  $10
  189. @qt:
  190.  END;
  191.  
  192. PROCEDURE ClearScreen; ASSEMBLER;
  193.  ASM
  194.      MOV  ah,$07
  195.      MOV  al,$00
  196.      MOV  bh,attribute
  197.      MOV  ch,wito
  198.      MOV  cl,wile
  199.      MOV  dh,wibo
  200.      MOV  dl,wiri
  201.      INT  $10
  202.      MOV  ah,$02
  203.      MOV  bh,page
  204.      MOV  dl,wile
  205.      MOV  dh,wito
  206.      INT  $10
  207.  END;
  208.  
  209. PROCEDURE ClearWholeScreen; ASSEMBLER;
  210.  ASM
  211.      MOV  ah,$07
  212.      MOV  al,$00
  213.      MOV  bh,attribute
  214.      MOV  ch,0
  215.      MOV  cl,0
  216.      MOV  dh,scrY
  217.      DEC  dh
  218.      MOV  dl,scrX
  219.      DEC  dl
  220.      INT  $10
  221.  END;
  222.  
  223. PROCEDURE ClrScr; ASSEMBLER;
  224.  ASM
  225.      MOV  ax,$0600
  226.      MOV  bh,007
  227.      MOV  cx,$0000
  228.      MOV  dx,$FFFF
  229.      INT  $10
  230.      MOV  ah,002
  231.      MOV  bh,000
  232.      MOV  dx,$0000
  233.      INT  $10
  234.  END;
  235.  
  236. PROCEDURE Color(fg,bg:BYTE); ASSEMBLER;
  237.  ASM
  238.      MOV  al,bg
  239.      SHL  al,4
  240.      AND  fg,$0F
  241.      ADD  al,fg
  242.      MOV  attribute,al
  243.  END;
  244.  
  245. PROCEDURE Cursor(mode:BYTE); ASSEMBLER;
  246.  ASM
  247.      MOV  ah,$01
  248.      MOV  cl,fontsize
  249.      DEC  cl
  250.      AND  cl,00011111b
  251.      CMP  mode,CurNone
  252.      JE   @nn
  253.      CMP  mode,CurBlock
  254.      JE   @fl
  255.      MOV  ch,cl
  256.      DEC  ch
  257.      AND  ch,000111111b
  258.      JMP  @vd
  259. @nn: MOV  ch,011000000b
  260.      JMP  @vd
  261. @fl: MOV  ch,000000000b
  262. @vd: INT  $10
  263.  END;
  264.  
  265. PROCEDURE DefineLed(led:BYTE; method:BOOLEAN); ASSEMBLER;
  266.  ASM
  267.      MOV  ax,$0040
  268.      MOV  es,ax
  269.      MOV  ah,led
  270.      CMP  method,ON { if not turn on, then off }
  271.      JE   @aa
  272.      NOT  ah
  273.      AND  es:[$0017],ah
  274.      JMP  @nx
  275. @aa: OR   es:[$0017],ah
  276. @nx: MOV  ah,$01
  277.      INT  $16
  278.  END;
  279.  
  280. PROCEDURE GetPos(VAR xpos,ypos:BYTE); ASSEMBLER;
  281.  ASM
  282.      MOV  ah,$03
  283.      MOV  bh,$00
  284.      INT  $10
  285.      INC  dl
  286.      INC  dh
  287.      SUB  dl,wile
  288.      SUB  dh,wito
  289.      LES  bx,xpos
  290.      MOV  es:[bx],dl
  291.      LES  bx,ypos
  292.      MOV  es:[bx],dh
  293.  END;
  294.  
  295. PROCEDURE GetVideoData; ASSEMBLER;
  296.  ASM
  297.      MOV  ah,$0F
  298.      INT  $10
  299.      MOV  page,bh
  300.      MOV  scrX,AH
  301.      DEC  AH
  302.      MOV  wiri,ah
  303.      MOV  wile,0
  304.      MOV  ax,$0040
  305.      MOV  es,ax
  306.      MOV  al,es:[$0084]
  307.      MOV  wibo,al
  308.      MOV  wito,0
  309.      INC  al
  310.      MOV  scrY,al
  311.      MOV  al,es:[$0086]
  312.      MOV  fontsize,al
  313.      MOV  ah,$08
  314.      MOV  bh,page
  315.      INT  $10
  316.      MOV  attribute,ah
  317.  END;
  318.  
  319. PROCEDURE Intense(state:BOOLEAN); ASSEMBLER;
  320.  ASM
  321.      MOV  ax,$1003
  322.      MOV  bl,$00
  323.      CMP  state,ON
  324.      JE   @nx
  325.      MOV  bl,$01
  326. @nx: INT  $10
  327.  END;
  328.  
  329. PROCEDURE LowerCase(VAR stg:STRING); ASSEMBLER;
  330.  ASM
  331.      LES  di,stg
  332.      MOV  bl,es:[di]
  333.      MOV  bh,$00
  334. @lp: MOV  al,es:[bx+di]
  335.      CMP  al,'A'
  336.      JB   @nx
  337.      CMP  al,'Z'
  338.      JA   @na
  339.      XOR  al,$20
  340. @na: CMP  al,'Æ'
  341.      JNE  @nb
  342.      MOV  al,'æ'
  343. @nb: CMP  al,'¥'
  344.      JNE  @nc
  345.      MOV  al,'¢'
  346. @nc: CMP  al,'Å'
  347.      JNE  @nx
  348.      MOV  al,'å'
  349. @nx: MOV  es:[bx+di],al
  350.      DEC  bx
  351.      CMP  bx,0
  352.      JA   @lp
  353.  END;
  354.  
  355. PROCEDURE PcPlay(lpt,size,delay:WORD; VAR snd); ASSEMBLER;
  356.  ASM
  357.      PUSH ds
  358.      MOV  dx,Lpt
  359.      MOV  bx,size
  360.      LDS  si,snd
  361. @lp: LODSB
  362.      OUT  dx,al
  363.      { ms wait }
  364.      MOV  ax,1000
  365.      MUL  delay
  366.      MOV  cx,dx
  367.      MOV  dx,ax
  368.      MOV  ah,$86
  369.      INT  $15
  370.      { ms wait }
  371.      DEC  bx
  372.      JNZ  @lp
  373.      POP  ds
  374.  END;
  375.  
  376. PROCEDURE ScrollDown(lines:BYTE); ASSEMBLER;
  377.  ASM
  378.      MOV  ah,$07
  379.      MOV  al,lines
  380.      MOV  bh,attribute
  381.      MOV  cl,wile
  382.      MOV  ch,wito
  383.      MOV  dl,wiri
  384.      MOV  dh,wibo
  385.      INT  $10
  386.  END;
  387.  
  388. PROCEDURE ScrollUp(lines:BYTE); ASSEMBLER;
  389.  ASM
  390.      MOV  ah,$06
  391.      MOV  al,lines
  392.      MOV  bh,attribute
  393.      MOV  cl,wile
  394.      MOV  ch,wito
  395.      MOV  dl,wiri
  396.      MOV  dh,wibo
  397.      INT  $10
  398.  END;
  399.  
  400. PROCEDURE SetPos(xpos,ypos:BYTE); ASSEMBLER;
  401.  ASM
  402.      MOV  dl,xpos
  403.      DEC  dl
  404.      ADD  dl,wile
  405.      CMP  dl,wiri
  406.      JA   @qt
  407.      MOV  dh,ypos
  408.      DEC  dh
  409.      ADD  dh,wito
  410.      CMP  dh,wibo
  411.      JA   @qt
  412.      MOV  bh,page
  413.      MOV  ah,$02
  414.      INT  $10
  415. @qt:
  416.  END;
  417.  
  418. PROCEDURE SetWindow(xa,ya,xb,yb:BYTE); ASSEMBLER;
  419.  ASM
  420.      MOV  al,xa
  421.      DEC  al
  422.      CMP  al,0
  423.      JL   @qt
  424.      MOV  bl,ya
  425.      DEC  bl
  426.      CMP  bl,0
  427.      JL  @qt
  428.      MOV  cl,xb
  429.      CMP  cl,scrX
  430.      JA   @qt
  431.      DEC  cl
  432.      MOV  dl,yb
  433.      CMP  dl,scrY
  434.      JA   @qt
  435.      DEC  dl
  436.      MOV  wile,al
  437.      MOV  wito,bl
  438.      MOV  wiri,cl
  439.      MOV  wibo,dl
  440. @qt:
  441.  END;
  442.  
  443. PROCEDURE Silence; ASSEMBLER;
  444.  ASM
  445.      IN   al,$61
  446.      AND  al,252
  447.      OUT  $61,al
  448.  END;
  449.  
  450. PROCEDURE Speaker(frequency:WORD); ASSEMBLER;
  451.  ASM
  452.      IN   al,$61
  453.      OR   al,$03
  454.      OUT  $61,al
  455.      MOV  al,182
  456.      OUT  $43,al
  457.      MOV  ax,frequency
  458.      OUT  $42,al
  459.      MOV  al,ah
  460.      OUT  $42,al
  461.  END;
  462.  
  463. PROCEDURE ToggleLed(led:BYTE); ASSEMBLER;
  464.  ASM
  465.      MOV  ax,$0040
  466.      MOV  es,ax
  467.      MOV  ah,led
  468.      XOR  es:[$0017],ah
  469.      MOV  ah,$01
  470.      INT  $16
  471.  END;
  472.  
  473. PROCEDURE UpperCase(VAR stg:STRING); ASSEMBLER;
  474.  ASM
  475.      LES  di,stg
  476.      MOV  bl,es:[di]
  477.      MOV  bh,$00
  478. @lp: MOV  al,es:[bx+di]
  479.      CMP  al,'a'
  480.      JB   @nx
  481.      CMP  al,'z'
  482.      JA   @na
  483.      XOR  al,$20
  484. @na: CMP  al,'æ'
  485.      JNE  @nb
  486.      MOV  al,'Æ'
  487. @nb: CMP  al,'¢'
  488.      JNE  @nc
  489.      MOV  al,'¥'
  490. @nc: CMP  al,'å'
  491.      JNE  @nx
  492.      MOV  al,'Å'
  493. @nx: MOV  es:[bx+di],al
  494.      DEC  bx
  495.      CMP  bx,0
  496.      JA   @lp
  497.  END;
  498.  
  499. PROCEDURE UseDosFont(font:POINTER);
  500.  VAR o,s:WORD;
  501.  BEGIN
  502.    o:=Ofs(font^)+1; s:=Seg(font^);
  503.    ASM
  504.      PUSH bp
  505.      MOV  ax,$1110
  506.      MOV  es,s
  507.      MOV  bp,o
  508.      MOV  cx,$0100
  509.      MOV  dx,$0000
  510.      MOV  bh,es:[bp-1]
  511.      MOV  bl,$00
  512.      INT  $10
  513.      POP  bp
  514.    END;
  515.  END;
  516.  
  517. PROCEDURE Wait(ms:WORD); ASSEMBLER;
  518.  ASM
  519.      MOV  ax,1000
  520.      MUL  ms
  521.      MOV  cx,dx
  522.      MOV  dx,ax
  523.      MOV  ah,$86
  524.      INT  $15
  525.  END;
  526.  
  527. PROCEDURE Wrt(line:STRING); ASSEMBLER;
  528.  ASM
  529.      MOV  ah,$03
  530.      MOV  bh,$00
  531.      INT  $10
  532.      PUSH bp
  533.      MOV  ax,$1300
  534.      MOV  bh,page
  535.      MOV  bl,attribute
  536.      LES  bp,line
  537.      INC  bp
  538.      MOV  ch,0
  539.      MOV  cl,wiri
  540.      SUB  cl,dl
  541.      INC  cl
  542.      CMP  cl,es:[bp-1]
  543.      JL   @nx
  544.      MOV  cl,es:[bp-1]
  545. @nx: INT  $10
  546.      POP  bp
  547.  END;
  548.  
  549. PROCEDURE WrtPos(xpos,ypos:BYTE; line:STRING); ASSEMBLER;
  550.  ASM
  551.      MOV  dl,xpos
  552.      DEC  dl
  553.      ADD  dl,wile
  554.      CMP  dl,wiri
  555.      JA   @qt
  556.      MOV  dh,ypos
  557.      DEC  dh
  558.      ADD  dh,wito
  559.      CMP  dh,wibo
  560.      JA   @qt
  561.      PUSH bp
  562.      MOV  ax,$1300
  563.      MOV  bh,page
  564.      MOV  bl,attribute
  565.      LES  bp,line
  566.      INC  bp
  567.      MOV  ch,0
  568.      MOV  cl,wiri
  569.      SUB  cl,dl
  570.      INC  cl
  571.      CMP  cl,es:[bp-1]
  572.      JL   @nx
  573.      MOV  cl,es:[bp-1]
  574. @nx: INT  $10
  575.      POP  bp
  576. @qt:
  577.  END;
  578.  
  579. {****************************************************************************}
  580.  
  581. FUNCTION  Byte2Hex(bte:BYTE):STRING;
  582.  BEGIN
  583.    Byte2Hex:='$'+Hexes[bte SHR 4]+Hexes[bte AND $F];
  584.  END;
  585.  
  586. FUNCTION  ByteSize(filename:STRING):LONGINT;
  587.  VAR fil:FILE OF BYTE;
  588.  BEGIN
  589.    Assign(fil,filename);
  590.    Reset(fil);
  591.    ByteSize:=FileSize(fil);
  592.    Close(fil);
  593.  END;
  594.  
  595. FUNCTION  CurrentKey:CHAR; ASSEMBLER; { with wait if no key }
  596.  ASM
  597.      MOV  ax,$0040
  598.      MOV  es,ax
  599.      MOV  ax,$0000
  600. @wt: MOV  bx,es:[$001A]
  601.      CMP  bx,es:[$001C]
  602.      JZ   @wt
  603.      MOV  ax,es:[bx]
  604.      MOV  ScanCode,ah
  605.  END;
  606.  
  607. FUNCTION  Dec2Word(stg:STRING):WORD;
  608.  VAR tmp:WORD; t:BYTE;
  609.  BEGIN
  610.    tmp:=0;
  611.    FOR t:=1 TO Len(stg) DO tmp:=tmp*10+ORD(stg[t])-48;
  612.    Dec2Word:=tmp;
  613.  END;
  614.  
  615. FUNCTION  Deg2Rad(deg:REAL):REAL;
  616.  BEGIN
  617.    Deg2Rad:=(deg*pi)/180;
  618.  END;
  619.  
  620. FUNCTION  Factorize(VAR nr:WORD):WORD;
  621.  VAR t:WORD;
  622.  BEGIN
  623.    FOR t:=2 TO (nr DIV 2+1) DO IF (nr/t=nr DIV t) THEN
  624.     BEGIN
  625.       Factorize:=t;
  626.       nr:=nr DIV t;
  627.       Exit;
  628.     END;
  629.    Factorize:=1;
  630.  END;
  631.  
  632. FUNCTION  Factorize2String(nr:WORD):STRING;
  633.  VAR t:WORD; s,r:STRING;
  634.  BEGIN
  635.    Str(nr,s); s:=s+'=';
  636.    REPEAT
  637.      t:=Factorize(nr);
  638.      IF t>1 THEN
  639.       BEGIN
  640.         Str(t,r);
  641.         s:=s+r+'*';
  642.       END
  643.      ELSE
  644.       BEGIN
  645.         Str(nr,r);
  646.         s:=s+r;
  647.       END;
  648.    UNTIL t=1;
  649.   Factorize2String:=s;
  650.  END;
  651.  
  652. FUNCTION  File2Pointer(filename:STRING; VAR fl:POINTER):WORD;
  653.  VAR size:LONGINT; fil:FILE;
  654.  BEGIN
  655.    IF NOT FileExists(filename) THEN
  656.     BEGIN
  657.       File2Pointer:=0;
  658.       Exit;
  659.     END;
  660.    size:=ByteSize(filename);
  661.    IF size>65530 THEN
  662.     BEGIN
  663.       File2Pointer:=0;
  664.       Exit;
  665.     END;
  666.    GetMem(fl,size);
  667.    File2Pointer:=size;
  668.    Assign(fil,filename);
  669.    Reset(fil,1);
  670.    BlockRead(fil,fl^,size);
  671.    Close(fil);
  672.  END;
  673.  
  674. FUNCTION  FileExists(filename:STRING):BOOLEAN;
  675.  VAR fil:FILE;
  676.  BEGIN
  677.    {$I-}
  678.    Assign(fil,filename);
  679.    FileMode:=0;
  680.    Reset(fil);
  681.    Close(fil);
  682.    {$I+}
  683.    FileExists:=(IOResult=0) AND (filename<>'');
  684.  END;
  685.  
  686. FUNCTION  GetKey:CHAR; ASSEMBLER; { with wait if no key }
  687.  ASM
  688.      MOV  ax,$0040
  689.      MOV  es,ax
  690. @wt: MOV  bx,es:[$001A]
  691.      CMP  bx,es:[$001C]
  692.      JZ   @wt
  693.      MOV  ax,es:[bx]
  694.      MOV  ScanCode,AH
  695.      ADD  bx,2
  696.      CMP  bx,es:[$0082]
  697.      JB   @nx           { buffer not at end }
  698.      MOV  bx,es:[$0080]
  699. @nx: MOV  es:[$001A],bx
  700.  END;
  701.  
  702. FUNCTION  InString(small,big:STRING):BOOLEAN;
  703.  VAR tmp:BYTE;
  704.  BEGIN
  705.    InString:=FALSE;
  706.    IF Len(small)>Len(big) THEN Exit;
  707.    UpperCase(small);
  708.    UpperCase(big);
  709.    FOR tmp:=1 TO (Len(big)-Len(small)+1) DO
  710.    IF Copy(big,tmp,Len(small))=small THEN
  711.     BEGIN
  712.       InString:=TRUE;
  713.       Exit;
  714.     END;
  715.  END;
  716.  
  717. FUNCTION  InterruptVector(pntr:POINTER; itr:BYTE):POINTER;
  718.  BEGIN
  719.    ASM CLI END;
  720.    InterruptVector:=Ptr(MemW[0:itr*4+2],MemW[0:itr*4]);
  721.    MemW[0:itr*4]:=Ofs(pntr^); MemW[0:itr*4+2]:=Seg(pntr^);
  722.    ASM STI END;
  723.  END;
  724.  
  725. FUNCTION  IsPrime(nr:WORD):BOOLEAN; ASSEMBLER;
  726.  ASM
  727.      MOV  si,2
  728.      MOV  di,nr
  729.      SHR  di,1
  730.      MOV  bx,nr
  731. @nn: MOV  dx,0
  732.      MOV  ax,bx
  733.      DIV  si
  734.      CMP  dx,0
  735.      JE   @ff
  736.      INC  si
  737.      CMP  si,di
  738.      JB   @nn
  739.      MOV  al,TRUE
  740.      JMP  @qt
  741. @ff: MOV  al,FALSE
  742. @qt:
  743.  END;
  744.  
  745. FUNCTION  KeyWaiting:BOOLEAN; ASSEMBLER;
  746.  ASM
  747.      MOV  ax,$0040
  748.      MOV  es,ax
  749.      MOV  al,FALSE
  750.      MOV  bx,es:[$001A]
  751.      CMP  bx,es:[$001C]
  752.      JE   @qt
  753.      MOV  al,TRUE
  754. @qt:
  755.  END;
  756.  
  757. FUNCTION  Len(stg:STRING):BYTE; ASSEMBLER;
  758.  ASM
  759.      LES  di,stg
  760.      MOV  al,es:[di]
  761.  END;
  762.  
  763. FUNCTION  NextPrime(VAR nr:WORD):BOOLEAN;
  764.  VAR t:WORD;
  765.  BEGIN
  766.    FOR t:=nr+1 TO 65521 DO IF IsPrime(t) THEN
  767.     BEGIN
  768.       NextPrime:=TRUE;
  769.       nr:=t;
  770.       Exit;
  771.     END;
  772.    NextPrime:=FALSE;
  773.  END;
  774.  
  775. FUNCTION  Null(nr,len:INTEGER):STRING;
  776.  VAR s:STRING;
  777.  BEGIN
  778.    Str(nr:0,s);
  779.    WHILE len>Length(s) DO s:='0'+s;
  780.    Null:=s;
  781.  END;
  782.  
  783. FUNCTION  Rad2Deg(rad:REAL):REAL;
  784.  BEGIN
  785.    Rad2Deg:=(180*rad)/pi;
  786.  END;
  787.  
  788. FUNCTION  Word2Hex(wrd:WORD):STRING;
  789.  BEGIN
  790.    Word2Hex:='$'+Hexes[Hi(wrd) SHR  4]+Hexes[Hi(wrd) AND $F]+
  791.                  Hexes[Lo(wrd) SHR  4]+Hexes[Lo(wrd) AND $F];
  792.  END;
  793.  
  794.  
  795. FUNCTION  X2Y(x,y:REAL):REAL;
  796.  BEGIN
  797.    X2Y:=Exp(y*Ln(x));
  798.  END;
  799.  
  800. {****************************************************************************}
  801.  
  802. BEGIN
  803.   Audio:=ON;
  804. END.